#pragma once

#include "comm.hpp"
#include "util.hpp"

namespace ns_log
{
    // 枚举变量 ———— 日志等级
    enum
    {
        INFO,
        DEBUG,
        WARNING,
        ERROR,
        FATAL
    };

    // 因为日志会频繁调用,设计为内敛函数,可以减少函数开辟栈帧的时间
    // 开放式的日志 ———— 返回值为std::ofstream&流提取 ———— Log() << message;
    inline std::ostream &Log(const std::string &level, const std::string &file_name, int lines)
    {
        std::string message;

        // 日志等级
        message += "[";
        message += level;
        message += "]";

        // 日志时间戳
        message += "[";
        message += ns_util::TimeUtil::GetTimeStamp();
        message += "]";

        // 日志错误文件
        message += "[";
        message += file_name;
        message += "]";

        // 日志报错行
        message += "[";
        message += std::to_string(lines);
        message += "]";

        // cout 内部包含缓冲区,不换行是不会被刷新到屏幕上的
        std::cout << message;

        return std::cout;
    }

// #level #+宏定义参数可以将其作为字符串输入到Log函数
// LOG(INFO) << "message" << std::endl;
#define LOG(level) Log(#level, __FILE__, __LINE__)

} // namespace ns_log
